/**
 * 文件名：@PermissionSecurityProcessor.java <br/>
 * 包名：cn.efunbox.afw.web.security.processor <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.security.processor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.method.HandlerMethod;

import cn.efunbox.afw.core.security.Permission;

/**
 * 类名：PermissionSecurityProcessor  <br />
 *
 * 功能：权限安全处理器，针对cn.efunbox.afw.core.security.Permission注解的处理
 *
 * @author xtwin <br />
 * 创建时间：2016年8月4日 上午10:25:10  <br />
 * @version 2016年8月4日
 */
public abstract class AbstractPermissionSecurityProcessor implements SecurityProcessor {

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月4日 上午10:25:28<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.web.security.processor.SecurityProcessor#process(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	public void process(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		if (! (handler instanceof HandlerMethod)) {
			return;
		}
		
		// 解析出权限对象
		Permission permission = resolvePermission(request, response, (HandlerMethod) handler);
		
		if (null == permission) {
			// 不需要执行Permission权限校验
			return ;
		}
		
		// 执行权限校验
		doPermission(permission, request, response, (HandlerMethod) handler);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月4日 上午10:29:11 <br/>
	 */
	protected abstract void doPermission(Permission permission, HttpServletRequest request, HttpServletResponse response, HandlerMethod handler) throws Exception;
	
	/**
	 * 功能：解析出当前的权限定义 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月4日 上午10:28:45 <br/>
	 */
	protected Permission resolvePermission(HttpServletRequest request, HttpServletResponse response, HandlerMethod hm) {
		Permission permission = AnnotationUtils.findAnnotation(hm.getMethod(), Permission.class);
		if (null == permission) {
			// 方法上没有定义，查找类上面的定义
			permission = AnnotationUtils.findAnnotation(hm.getMethod().getDeclaringClass(), Permission.class);
		}
		
		return permission;
	}
}